/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.sgbl.dao;

import br.com.sgbl.bean.Fornecedor;
import br.com.sgbl.bean.Produto;
import br.com.sgbl.bean.Setor;
import br.com.sgbl.utils.Conexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author heidi
 */
public class ProdutoDao {

    private static final String SQL_LISTAR =
            "SELECT * FROM produto";
    private static final String SQL_INSERIR =
            "INSERT INTO produto (id, descricao, preco, unidade, fk_setor_id, fk_fornecedor_id) VALUES (?,?,?,?,?,?)";
    private static final String SQL_ALTERAR =
            "UPDATE produto SET descricao = ?, preco = ?,unidade = ?, fk_setor_id = ? , fk_fornecedor_id = ? WHERE id = ?";
    private static final String SQL_EXCLUIR =
            "DELETE FROM produto WHERE id = ?";

    public Produto localizar(Connection conn, long codigo) throws SQLException {
        PreparedStatement ps = conn.prepareStatement(SQL_LISTAR + " where id= ?");
        ps.setLong(1, codigo);

        ResultSet rs = ps.executeQuery();

        if (rs.first()) {
            Produto produto = new Produto();
            produto.setId(rs.getLong("id"));
            produto.setDescricao(rs.getString("descricao"));
            produto.setPreco(rs.getDouble("preco"));
            produto.setUnidade(rs.getInt("unidade"));
            SetorDao setorDao = new SetorDao();
            Setor setor = setorDao.localizar(conn, rs.getLong("fk_setor_id"));
            produto.setSetor(setor);
            
            FornecedorDao fornecedorDao = new FornecedorDao(); 
            Fornecedor fornecedor = fornecedorDao.localizar(conn, rs.getLong("fk_fornecedor_id"));
            produto.setFornecedor(fornecedor);
            

            return produto;
        } else {
            return null;
        }
    }

    public Produto salvar(Produto produto) throws SQLException {
        if (produto.getId() == 0) {
            return inserir(produto);
        } else {
            return alterar(produto);
        }
    }

    private Produto inserir(Produto produto) throws SQLException {
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_INSERIR,
                    PreparedStatement.RETURN_GENERATED_KEYS);

            ps.setNull(1, Types.NULL);
            ps.setString(2, produto.getDescricao());
            ps.setDouble(3, produto.getPreco());
            ps.setInt(4, produto.getUnidade());
            ps.setLong(5, produto.getSetor().getId());
            ps.setLong(6, produto.getFornecedor().getId());

            ps.executeUpdate();

            ResultSet rs = ps.getGeneratedKeys();
            rs.first();

            produto.setId(rs.getLong("GENERATED_KEY"));

            conn.commit();
        } finally {
            conn.close();
        }

        return produto;
    }

    private Produto alterar(Produto produto) throws SQLException {
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_ALTERAR);

            ps.setString(1, produto.getDescricao());
            ps.setDouble(2, produto.getPreco());
            ps.setInt(3, produto.getUnidade());
            ps.setLong(4, produto.getSetor().getId());
            ps.setLong(5, produto.getFornecedor().getId());
            ps.setLong(6, produto.getId());


            ps.executeUpdate();

            conn.commit();
        } finally {
            conn.close();
        }

        return produto;
    }

    public List listar() throws SQLException {
        List lista = new ArrayList();

        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_LISTAR);

            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                Produto produto = new Produto();

                produto.setId(rs.getLong("id"));
                produto.setDescricao(rs.getString("descricao"));
                produto.setPreco(rs.getDouble("preco"));
                produto.setUnidade(rs.getInt("unidade"));

                SetorDao setorDao = new SetorDao();
                Setor setor = setorDao.localizar(conn, rs.getLong("fk_setor_id"));
                produto.setSetor(setor);
                
                FornecedorDao fornecedorDao = new FornecedorDao();
                Fornecedor fornecedor = fornecedorDao.localizar(conn, rs.getLong("fk_fornecedor_id"));
                produto.setFornecedor(fornecedor);

                lista.add(produto);
            }
        } finally {
            conn.close();
        }

        return lista;
    }

    public void excluir(Produto produto) throws SQLException {
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_EXCLUIR);

            ps.setLong(1, produto.getId());

            ps.executeUpdate();

            conn.commit();
        } finally {
            conn.close();
        }
    }
}
